/*	--- JDBC事务 --- 


【数据库事务（Transaction）】是由【若干个SQL语句】构成的【一个操作序列】，有点类似于【Java的synchronized同步】。

【数据库系统】保证在【一个事务中】的【所有SQL】要么【全部执行成功】，要么【全部不执行】


即【数据库事务】具有【ACID特性】：
	· Atomicity：原子性
	· Consistency：一致性
	· Isolation：隔离性
	· Durability：持久性



【数据库事务】可以【并发执行】，而【数据库系统】从【效率】考虑，对【事务】定义了【不同的隔离级别】。

【SQL标准】定义了【4种隔离级别】，分别对应可能出现的【数据不一致的情况】：


Isolation Level		脏读（Dirty Read）	不可重复读（Non Repeatable Read）	幻读（Phantom Read）
-----------------------------------------------------
Read Uncommitted	Yes		Yes		Yes
Read Committed		-		Yes		Yes
Repeatable Read		-		-		Yes
Serializable		-		-		-



对应用程序来说，【数据库事务】非常重要，很多运行着【关键任务】的应用程序，都必须依赖数据库事务保证程序的结果正常。

举个例子：假设【小明】准备给【小红】支付【100】，两人在【数据库】中的【记录主键】分别是【123】和【456】，那么用【2条SQL语句操作】如下：


UPDATE accounts SET balance = balance - 100 WHERE id=123 AND balance >= 100;
UPDATE accounts SET balance = balance + 100 WHERE id=456;

这两条语句必须以【事务方式】执行才能保证【业务的正确性】，因为一旦【第一条SQL执行成功而第二条SQL失败的话】，系统的钱就会凭空减少100;
而有了【事务】，要么这笔转账成功，要么转账失败，双方账户的钱都不变。


-------------------------------------------------


这里我们不讨论【详细的SQL事务】，如果对【SQL事务】不熟悉，请参考【SQL事务】。


要在【JDBC】中执行【事务】，本质上就是如何把【多条SQL】包裹在【一个数据库事务中】执行。


我们来看JDBC的事务代码：*/
Connection conn = openConnection();

try {
	// 关闭自动提交
	conn.setAutoCommit(false);

	// 执行多条SQL语句
	insert();
	update();
	delete();

	// 提交事务
	conn.commit();

} catch (SQLException e) {
	// 回滚事务
	conn.rollback();
} finally {
	conn.setAutoCommit(true);
	conn.close();
}



/*

其中，【开启事务】的关键代码是【conn.setAutoCommit(false) 】，表示【关闭自动提交】。

【提交事务的代码】在执行完【指定的若干条SQL语句】后，调用【conn.commit()】。

要注意【事务】不是总能成功，如果【事务提交失败】，会抛出【SQL异常（也可能在执行SQL语句的时候就抛出了）】，此时我们必须捕获并调用【conn.rollback()回滚事务】。

最后，在finally中通过【conn.setAutoCommit(true) 】把【Connection对象的状态】恢复到【初始值】。

实际上，默认情况下，我们获取到【Connection连接】后，总是处于【“自动提交”模式】。

也就是【每执行一条SQL】都是作为【事务】自动执行的，这也是为什么前面几节我们的【更新操作】总能成功的原因：因为【默认】有这种“隐式事务”。

只要关闭了【Connection的autoCommit】，那么就可以在【一个事务】中执行【多条语句】，【事务】以【commit()方法】结束。


如果要设定【事务的隔离级别】，可以使用如下代码： */
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
	// 设定【隔离级别】为【TRANSACTION_READ COMMITTED, 事务读取已提交】
		// Transaction  n.  业务,交易,事务

/* 

如果没有调用上述方法，那么会使用【数据库的默认隔离级别】。

【MySQL的默认隔离级别】是【REPEATABLE READ】。



=========================================================


#	----- JDBC事务 の 小结 ----- 


1. 数据库事务（Transaction）具有ACID特性：

	· Atomicity：原子性
	· Consistency：一致性
	· Isolation：隔离性
	· Durability：持久性

2. JDBC提供了事务的支持，使用Connection可以开启、提交或回滚事务。

3. 【MySQL的默认隔离级别】是【REPEATABLE READ】。

4. 设定【事务的隔离级别】，可以使用如下代码： */
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);








































